package gin2

import (
	"fmt"
	"strings"
)

// Pager 分页控件
type Pager1 struct {
	PageIndex          int    // 当前页码(从1开始)
	DataCount          int    // 数据总数
	PageSize           int    // 每页大小
	ShowPageCount      int    // 显示的分页数量
	JSCallbackFunction string // JS回调函数名
	ShowDataCount      bool   //是否显示总数
}

const (
	DefaultPageSize  = 20
	DefaultPageIndex = 1
	DefaultShowPages = 5
	DefaultCallback  = "pagerFunction"
)

// NewPager1 创建分页器
func NewPager1V1(pageIndex, dataCount int) *Pager1 {
	return NewPager1V2(pageIndex, dataCount, DefaultPageSize)
}

func NewPager1V2(pageIndex, dataCount int, pageSize int) *Pager1 {
	p := &Pager1{
		PageIndex:          pageIndex,
		DataCount:          dataCount,
		PageSize:           pageSize,
		ShowPageCount:      DefaultShowPages,
		JSCallbackFunction: DefaultCallback,
		ShowDataCount:      true,
	}
	if p.PageIndex < 1 {
		p.PageIndex = DefaultPageIndex
	}
	return p
}

// 是否显示总数
func (p *Pager1) SetShowDataCount(isShow bool) *Pager1 {
	p.ShowDataCount = isShow
	return p
}

// SetPageSize 设置每页大小
func (p *Pager1) SetPageSize(pageSize int) *Pager1 {
	p.PageSize = pageSize
	return p
}

// SetShowPageCount 设置显示的分页数量
func (p *Pager1) SetShowPageCount(showPageCount int) *Pager1 {
	p.ShowPageCount = showPageCount
	return p
}

// SetJSCallbackFunction 设置JS回调函数名
func (p *Pager1) SetJSCallbackFunction(callback string) *Pager1 {
	if callback != "" {
		p.JSCallbackFunction = callback
	}
	return p
}

// HTML 生成分页HTML
func (p *Pager1) Html() string {
	pageNo := p.PageIndex
	showPages := p.ShowPageCount
	// 计算总页数
	totalPage := p.DataCount / p.PageSize
	if p.DataCount%p.PageSize != 0 {
		totalPage++
	}
	if totalPage < 1 {
		return ""
	}
	callFunName := p.JSCallbackFunction
	if callFunName == "" {
		callFunName = DefaultCallback
	}
	var sb strings.Builder
	sb.WriteString(`<div class="page_list clearfix">`)
	// 首页和上一页
	if pageNo != 1 {
		sb.WriteString(fmt.Sprintf(`<a href="javascript:%s(%d);" class="top_page">首页</a>`, callFunName, 1))
		sb.WriteString(fmt.Sprintf(`<a href="javascript:%s(%d);" class="page_prev">上一页</a>`, callFunName, pageNo-1))
	}
	// 计算起始和结束页码
	start := 1
	if pageNo-(showPages/2) > 0 {
		start = pageNo - (showPages-1)/2
		if showPages > totalPage {
			start = 1
		}
	}
	end := totalPage
	if totalPage > showPages {
		end = start + showPages - 1
		if end > totalPage {
			start = totalPage - showPages + 1
			end = totalPage
		}
	}
	// 页码链接
	for page := start; page <= end; page++ {
		if page == pageNo {
			sb.WriteString(fmt.Sprintf(`<a href="javascript:%s(%d);" class="current">%d</a>`, callFunName, page, page))
		} else {
			sb.WriteString(fmt.Sprintf(`<a href="javascript:%s(%d);">%d</a>`, callFunName, page, page))
		}
	}
	// 下一页和尾页
	if pageNo != totalPage {
		sb.WriteString(fmt.Sprintf(`<a href="javascript:%s(%d);" class="page_next">下一页</a>`, callFunName, pageNo+1))
		sb.WriteString(fmt.Sprintf(`<a href="javascript:%s(%d);" class="end_page">尾页</a>`, callFunName, totalPage))
	}
	if p.ShowDataCount {
		sb.WriteString(fmt.Sprintf(`<span>总数:%d</span>`, p.DataCount))
	}
	sb.WriteString("</div>")
	return sb.String()
}

// 输出分页HTML并设置请求属性
func (p *Pager1) SetData(data map[string]any) {
	data["pageSize"] = p.PageSize
	data["pageIndex"] = p.PageIndex
	data["dataCount"] = p.DataCount
	data["pageHtml"] = p.Html()
}
